<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Object.defineProperty</title>
</head>
<body>
    <script>
        // Object.defineProperty()
        // 作用1. 给目标对象添加属性和值并设置权限  (定义一个不让同组人员修改的对象)
        // 作用2. 可以重写一个对象里属性取值和赋值的过程

        // 作用1:
        // let obj = {a: 19};
        // // 参数1: 扩展对象, 参数2: 添加/修改属性, 参数3: 权限配置项(对此属性进行设置)
        // Object.defineProperty(obj, 'age', { 
        //     value: 900, // 默认值
        //     configurable: false, // false不能被删除
        //     enumerable: false, // false不能被for...in遍历出来
        //     writable: false // false, obj.age不能被赋值 (默认不写都是 false)
        // })
        // console.log(obj.age); // 900

        // delete obj.age
        // console.log(obj);

        // obj.age = 100000;
        // console.log(obj.age);


        // 作用2:
        // 重写某个对象的属性的set和get方法(自己实现赋值和取值的动作)
        // set和get不能和上面的value和writable一起使用
        let obj2 = {hobby: '写代码'}
        let $obj2 = {hobby: '写代码'}
        Object.defineProperty(obj2, 'hobby', {
            set(val){ // val变量接'修改'字符
                $obj2.hobby = val
            },
            get(){
                // 不能写obj2.hobby取值会递归, 所以必须有个中间变量
                return $obj2.hobby
            }
        })
        
        // 用的时候还是该怎么写还怎么写
        obj2.hobby = "修改"
        console.log(obj2.hobby);


        // ES5没有const 
        // 作用1使用场景: 定义一个不能被别人 修改的属性
        // ES6 const
    </script>
</body>
</html>